LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

Appium

2025/8/12 运维

测试方面

  • 功能测试
  • 安装卸载测试
  • 升级测试
  • 兼容性测试[不同机型 系统]
  • 网络切换,中断测试
  • 横竖屏切换
  • 健壮性

测试环境的搭建

需要配置的环境:
  • java jdk java环境
  • Android sdk 安卓环境
  • python环境
    • 第三库:appium
  • 使用真机或模拟器进行测试【夜神模拟器】

环境搭建验证测试

模拟器或真机

在cmd中输入 adb devices 会返回ip地址和端口号
获取系统版本号输入 adb shell getprop ro.build.version.release
获取虚拟器里的app名称 adb shell dumpsys window windows | findstr mFocusedApp

{c361382 u0 com.android.settings/.Settings t9}}} /.后面是界面的名字 u0后 /.前是app名称

import time

from appium import webdriver
from selenium.webdriver.common.by import by  #【利用by自动获取信息】

# 配置手机连接的参数信息
# 参数信息都是以键值对的方式进行连接
desired_caps = {}

# 设备的名称
desired_caps["deviceName"] = "127.0.0.1:62001"

# 系统
desired_caps["platformName"] = "Android"

# 系统版本号
desired_caps["platformVersion"] = "7.1.2"

# 启动的app名称
## com.android.settings
desired_caps["appPackage"] = "com.android.settings"

# 启动的app界面:.Settings
desired_caps["appActivity"] = ".Settings"

# print(desired_caps)

# 发送链接  用的appium的端口  用关键字传参
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_capabilities = desired_caps)

time.sleep(5)
driver.quit()
...
...

app自动化测试的流程

① 首先明确项目的核心模块
  • 注册登录
  • 阅读文章
  • 搜索内容
  • 发布评论
  • 关注订阅
  • 私信聊天
  • 点赞等等
② 设计用例脚本

分析用例执行的步骤

  • 进入app首页
  • 点击我的界面
  • 点击登录/注册
  • 点击使用邮箱登录/注册
  • 输入邮箱号
  • 输入密码
  • 点击登录
  • 登录成功/失败
  • 进行断言
自动截取虚拟器上界面的图片查看详情

D:\android_sdk_test\tools\uiautomatorviewer.bat

若两个 resource-id 定位是一样的那么就需要手写XPATH【resource-id必须唯一!!】

####### 这些都是线性脚本!!!
# 两个斜杠是代表当前界面所有的元素  增加个文本标识
driver.find_element(By.XPATH,'//*[@text="我的"]').click()
# 点击登录/注册
driver.find_element(By.ID,'io.manong.developerdaily:id/login_btn').click()
# 点击使用邮箱登录/注册   这里有报错是因为代码执行很快 但界面有延迟 需要加等待
time.sleep(2)
driver.find_element(By.ID,'io.manong.developerdaily:id/btn_email').click()

# 输入邮箱号
time.sleep(2)
driver.find_element(By.ID,'io.manong.developerdaily:id/edt_email').send_keys("zzz@qq.com")
# 输入密码
driver.find_element(By.ID,'io.manong.developerdaily:id/edt_email').send_keys("123123")
# 点击登录
driver.find_element(By.XPATH,'//*[@text="登录"]').click()
# 用户名是tata
try:
name_text = driver.find_element(By.XPATH,'io.manong.developerdaily:id/nav_tv_name').click()
if name_text == "tata":
    print("登录成功")

# - 登录成功/失败
# - 进行断言
    assert name_text == "tata"
except:
    login_failed_msg = driver.find_element(By.XPATH,'io.manong.developerdaily:id/forgot').click()
    print("登录失败")
    assert login_failed_msg == "忘了密码?点此找回"
time.sleep(5)
...
...

若换了一个模块要重新截图 选取不同的app界面
这些用例测试属于冒烟测试的过程

Allure是一款灵活、轻量级的多语言测试报告工具,旨在生成美观且易于阅读的测试报告。它由Qameta Software团队开源,支持多种测试框架,如Pytest和TestNG等。Allure不仅可以快速查看测试结果,还能帮助团队成员清晰了解测试过程中的缺陷和问题。通过Allure,用户可以轻松集成测试用例,并生成统一格式的报告,提升测试的可读性和有效性。

总结梳理

核心业务流程梳理
  • 需求分析
  • 设计用例脚本
  • 编写自动化测试脚本
    • 将冒烟测试的脚本进行深度封装和模式设计
      • 选择设计模式:
        • POM设计模式
        • KDT设计模式
      • 引入测试框架pytest结合设计模式进行深度封装
      • 执行过程中进行日志信息的记录log
      • 执行完成之后自动化完成测试报告allure
      • 持续集成Jenkins
  • 脚本维护以及迭代更新

app自动化测试的核心技能点:

Python + Appium + pytest + parametrize + csv + pom + log + Allure + Jenkins

项目梳理及描述

脚本执行的时候会直接发送给Appium服务器 执行py代码后 在Appium会执行许多adb的命令 再去控制手机 完成自动化测试【线性模块 正反例要跑通噢】

站在项目已经完成雏形的基础上,进行项目梳理和总结

  • 整个项目中的文件解析

    • 每个文件包和模块具体的使用规范
  • 整个项目中的模块与文件之间的联系

    • 各个模块及包之间的导入使用
  • 整体从项目完成之后的角度触发去讲解项目搭建流程以及使用规范

    • 搭建app自动化测试环境

      • 安卓sdk
      • java的sdk
      • 安装appium
      • 使用真机或者安装手机模拟器
      • 安装第三方库:Appium-Python-Client
    • 编写自动化的用例线性脚本

      • 新建一个项目

      • 创建一个script脚本包

        • 梳理核心业务模块和功能

          • 登录
          • 注册
          • 点赞评论收藏
          • 发布文章
          • 浏览文章
        • 创建py模型进行线性脚本编写

          • 通过核心业务流程模块梳理出线性脚本的执行步骤
          • 然后通过编写自动化用例脚本执行完成第一轮正反例的冒烟测试
            • 梳理被操作元素以及具体操作方法
            • 执行正反例之后进行断言
            • 保证自动化用例的准确性

若是那种本身图标没有id 没有任何标志的 比如点赞,收藏,评论 就可以直接通过坐标去定位【要考虑分辨率和坐标以及机型】
回归测试一般只需要正例脚本!!!

  • 选择设计模式pom【Page Object Model页面对象模型的简称】

    • 封装
      • 一个类就是一个流程用例或者一个界面
      • 将界面中需要被操作的每一个元素封装成类属性
      • 将界面中需要被执行的用例步骤定义成一个实例方法
    • 使用
      • 创建页面类对象
      • 通过对象调用方法执行用例步骤脚本
      • 获取实际结果进行断言
    • 整个页面封装
    • 将线性文件进行封装
  • 引入测试框架结合用例执行以及管理

    • 用例进行综合管理
    • 使用参数化进行数据驱动测试:
    @pytest.mark.parametrize("user_email, password, t_a_f",[
        [" ", "123123", False],
        ["123@qq.com", "123123", True],
        ...
    ])
    
    • 一般情况在用例执行之前讲参数化使用的实参进行读取使用
      • 数据量比较多的情况下会使用不同的文件格式存储数据
        • Csv
        • text
        • Excel
        • yaml
        • JSON
      • 数据驱动测试主要核心就是在用例设计的过程中,把所有用例需要的正反例数据进行保存
      • 然后再使用的时候进行读取自动化操作用例完成脚本内容
  • 日志信息的记录

  • 缺陷报告的生成

  • 持续集成的处理

单独执行某个用例(venv) D:\app_project>pytest -vsk test_login
有很多其他的需要保持登录的情况下进行测试 ↓

# 点赞评论及收藏
def test_like_comment_collect(go_login):
    # 创建页面类对象
    l_c_l_page = LikeCommentCollectPage(go_login)
    # 通过对象调用方法执行用例步骤
    l_c_l_page.execute_cases()
    
# 发布文章
def test_publish_article(go_login):...

# 浏览文章
def test_browse_article(go_login):...

Pywinauto基本介绍【基本解决找不到元素问题】

主要用于自动化图形用户界面,他提供了一组功能丰富的工具和方法,能够模拟用户的各种操作:点击,输入,文本,选择菜单栏等等…从而实现对Windows应用程序的自动化控制

pywinauto的基本特性
  • 支持跨平台
  • 强大的GUI自动化功能【用户交互图形界面】
  • 简单易用
  • 支持多种应用程序的类型
  • 丰富的文档和社区支持
  • 支持多种GUI框架
  • 图像识别和模糊匹配
pywinauto应用场景
  • 自动化测试
  • ui自动化测试
  • 数据录入和处理
  • 窗口管理
pywinauto的安装和使用

需要安装第三方库依赖:pywinauto
安装命令:【pycharm可以在某个项目下安装】
pip install pywinauto
可以用pip list查看是否安装好了 pywinauto

pywinauto基本使用

案例:使用pywinauto编写自动化脚本,完成记事本的基本操作
操作流程:

  • 打开记事本
  • 点击帮助(关于记事本)
  • 点击确定
  • 输入内容
  • 点击关闭记事本
  • 点击不保存
# 导包
from pywinauto.application import Application

# 启动记事本  backend='uia'意思是连接记事本的后端是什么类型
# app = Application(backend='uia').start('notepad.exe')
app = Application(backend='win32').start('notepad.exe')

# 点击帮助(关于记事本) 使用快捷键完成打开关于记事本的信息  %是Alt符号  H:h  A:a
app.Notepad.type_keys('%HA', pause=1)

# 点击确定  re正则匹配
dlg = app.window(title_re='关于记事本')
 # 获取窗口的界面元素信息  【关于记事本的元素架构】
dlg.print_control_identifiers()
 #  点击    不直接调用click是要运用鼠标真实的模拟
time.sleep(1)
dlg['确定Button'].click_input()

# 输入内容
app.Notepad.type_keys('xx教育')
# 点击关闭记事本
 # 菜单栏选择 ->表示子菜单
app.Notepad.menu_select("文件(&F)->退出(&X)")
# 点击不保存
app.window(title_re='记事本').window(title_re='不保存').cli
桌面化元素定位工具:UISpy.exe【层级树】、inspect.exe